package main

import (
	"fmt"
	"reflect"
)

type ControllerInterface interface {
	Init(action string, method string)
}

type Controller struct {
	Action string
	Method string
	Tag    string `json:"tag"`
}

func (c *Controller) Init(action string, method string) {
	c.Action = action
	c.Method = method
}

func main() {

	a := []int{1, 2, 3}
	b := reflect.ValueOf(a)
	fmt.Println("1:", b, b.Len(), len(a))

	c := reflect.TypeOf(a)
	fmt.Println("2:", c)
	fmt.Println("3:", c.Kind())
	fmt.Println("4:", reflect.Slice)

	runController := &Controller{
		Action: "run1",
		Method: "GET",
	}
	//Controller实现了ControllerInterface方法,因此它就实现了ControllerInterface接口
	var i ControllerInterface
	i = runController
	// 得到实际的值,通过v我们获取存储在里面的值,还可以去改变值
	v := reflect.ValueOf(i)
	fmt.Println("value:", v)

	// 得到类型的元数据,通过t我们能获取类型定义里面的所有元素
	t := reflect.TypeOf(i)
	fmt.Println("type:", t)

	// Elem返回值v包含的接口
	controllerValue := v.Elem()
	fmt.Println("controllerType(reflect.Value):", controllerValue)
	//获取存储在第一个字段里面的值
	fmt.Println("Action:", controllerValue.Field(0).String())

	// Elem返回类型的元素类型。
	controllerType := t.Elem()
	tag := controllerType.Field(2).Tag //Field(第几个字段,index从0开始)
	fmt.Println("Tag:", tag)

}
